package com.qf.consumer.simple;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class ConsumerMain {
    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("cdm");

        Connection conn = factory.newConnection();
        Channel channel = conn.createChannel();

        //如果rabbitmq服务端没有这个名称的队列，创建。如果有，不创建
//        channel.queueDeclare("simple.que",true,false,false,null);

        //消费队列中的消息
        /*
            String queue : 消费的队列名称
            ***boolean autoAck: 是否自动确认。如果自动确认，消费后，消息就会自动删除。非自动确认，消息不删除，需要手动确认。消息确保时需要手动确认
            String consumerTag: 消费端的一个标识，消费端不变，这个标识不变
            boolean noLocal: 不支持
            boolean exclusive: 是否独占
            Map<String, Object> arguments： 额外参数
            DeliverCallback deliverCallback: 消息送达回调
            CancelCallback cancelCallback：消息取消回调

            String queue, boolean autoAck, Consumer callback
         */
        channel.basicConsume("simple.que",true,new DefaultConsumer(channel){
            /*
                String consumerTag: 消费端的一个标识
                Envelope envelope： 封装生产端的唯一标识、交换机、路由键等信息。在进行消息重试的时候，需要用到
                AMQP.BasicProperties properties 生产端发送过来的消息的额外信息
                byte[] body： 具体消息数据
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

                int i = 1/0;

                System.out.println("consumerTag:" + consumerTag);
                System.out.println("deliveryTag:" + envelope.getDeliveryTag());
                System.out.println("body:" + new String(body,"utf-8"));

                System.out.println("--------------------------------");
            }
        });

        //释放资源 （消费者要不要释放资源？？？）
//        channel.close();
//        conn.close();
    }
}
